"""


"""
import random

from re import match

from flask import current_app
from flask import request, jsonify
from flask import session

from info import constants, db
from info import redis_store
from info.models import User
from info.utils.captcha.captcha import captcha
from info.utils.response_code import RET
from . import passport_blu
from flask import make_response
from info.utils.yuntongxun.sms import CCP


@passport_blu.route("/image_code")
def image_code():
    """
    处理  生成图片验证码的请求 请求

    初步实现:
    1,生成图片验证码
    2,返回图片内容到浏览器

    最终实现:
    1,获取参数,判空
    2,生成图片验证码
    3,保存图片验证码文本信息到redis
    4,返回图片内容到浏览器
    """
    # 1, 获取参数, 判空
    image_code_id = request.args.get("image_code_id")
    if not image_code_id:
        return jsonify(errno=RET.PARAMERR , errmsg="参数错误")

    # 2, 生成图片验证码
    name, text, content = captcha.generate_captcha()

    # 3, 保存图片验证码文本信息到redis
    try:
        redis_store.set("IMAGE_CODE_ID_"+image_code_id, text, constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR , errmsg="数据库操作失败")

    # 4, 返回 '图片内容'content 到浏览器
    response = make_response(content)
    response.headers["Content-Type"] = "image/jpg"
    return response


@passport_blu.route("/sms_code", methods=["POST"])
def sms_code():
    """
    处理  发送短信验证码 请求

    1,获取参数,判空(校验参数的格式 手机格式)
    1.1 获取参数
    1.2 判空 校验
    2,对比用户输入的图片验证码和真实的图片验证码文本是否一致, 如果不一致return
    2.1 从redis中获取真实的图片验证码
    2.2 对比,如果不一致return
    3,发送短信
    3.1 查询数据库,看看这个手机用户是否存在,如果存在 ,就return
    3.2 发送短信
    3.3 保存短信验证码redis(以便后面注册的时候做对比)
    3.4 返回操作成功
    """
    # 1,获取参数,判空(校验参数的格式 手机格式)
    # 1.1 获取参数
    data_dict = request.json
    mobile = data_dict.get("mobile")  # 用户输入的 手机号
    image_code = data_dict.get("image_code")   # 用户输入的image_code
    image_code_id = data_dict.get("image_code_id")
    # 1.2 判空 校验
    if not all([mobile, image_code,image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    if not match(r"^1[3578][0-9]{9}$", mobile):
        return jsonify(errno=RET.DATAERR, errmsg="手机格式不正确")

    # 2,对比用户输入的图片验证码和真实的图片验证码文本是否一致, 如果不一致return
    # 2.1 从redis中获取真实的图片验证码
    try:
        real_image_code = redis_store.get("IMAGE_CODE_ID_"+image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")

    # 验证码已经过期的时候,获取到的real_image_code值为None
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg="验证码已经过期")
    # 2.2 对比,如果不一致return
    if image_code.lower() != real_image_code.decode().lower():
        return jsonify(errno=RET.DATAERR, errmsg="图片验证码输入错误")
    # 3,发送短信
    # 3.1 查询数据库,看看这个手机用户是否存在,如果存在 ,就return
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询失败")

    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg="用户已经存在")
    # 3.2 发送短信
    result = random.randint(0, 999999)
    sms_code = "%06d" % result
    # ccp = CCP()
    # result = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES//60], 1)
    # if result != 0:
    #     return jsonify(errno=RET.THIRDERR, errmsg="短信验证码发送失败")

    # 3.3 保存短信验证码redis(以便后面注册的时候做对比)
    try:
        redis_store.set("SMS_" + mobile, sms_code, constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")
    # 3.4 返回操作成功
    return jsonify(errno=RET.OK, errmsg="发送短信验证码成功")


@passport_blu.route("/register", methods=["POST"])
def register():
    """
    处理  注册 请求

    1,获取参数判空
    2,对比用户输入的手机短信验证码和redis中保存的是否一致, 如果不一致就return
    3,注册成功的本质是:在User表中增加一条记录(创建User()), 设置一些属性(手机号,密码)
    4,保持用户的登录状态
    5,返回注册成功
    """
    # 1,获取参数判空(手机号,用户输入的短信验证码,密码, 是否统一协议)
    data_dict = request.json
    mobile = data_dict.get("mobile")
    sms_code = data_dict.get("sms_code")
    password = data_dict.get("password")
    agree = data_dict.get("agree")
    if not all([mobile, sms_code, password, agree]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")
    # 2,对比用户输入的手机短信验证码和redis中保存的是否一致, 如果不一致就return
    try:
        real_sms_code = redis_store.get("SMS_" + mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")

    # 验证码已经过期的时候,获取到的real_sms_code值为None
    if not real_sms_code:
        return jsonify(errno=RET.NODATA, errmsg="验证码已经过期")

    if sms_code != real_sms_code.decode():
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码输入错误")
    # 3,注册成功的本质是:在User表中增加一条记录(创建User()), 设置一些属性(手机号,密码)
    user = User()
    user.mobile = mobile
    user.password = password
    user.nick_name = mobile  # 默认设置为手机号

    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")

    # 4,保持用户的登录状态
    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile
    # 5,返回注册成功
    return jsonify(errno=RET.OK, errmsg="注册成功")


@passport_blu.route("/login", methods=["POST"])
def login():
    """
    处理  登录 请求

    1,获取参数,判空
    2,查询数据库,验证手机号码是不是已经注册了
    3,校验密码是否正确  ,如果不正确 旧return
    4,保持用户的登录状态
    5,返回登陆成功
    """
    # 1,获取参数,判空
    data_dict = request.json
    mobile = data_dict.get("mobile")
    password = data_dict.get("password")
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")
    # 2,查询数据库,验证手机号码是不是已经注册了
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据库查询错误")
    if not user:
        return jsonify(errno=RET.USERERR,errmsg="用户不存在")

    # 3,校验密码是否正确  ,如果不正确 旧return
    if not user.check_passowrd(password):
        return jsonify(errno=RET.PWDERR,errmsg="密码错误")

    # 4,保持用户的登录状态
    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile

    # 设置最后一次登录时间
    from datetime import datetime
    user.last_login = datetime.now()
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)


    # 5,返回登陆成功
    return jsonify(errno=RET.OK, errmsg="登录成功")


@passport_blu.route("/logout")
def logout():
    """
    处理  退出登录 请求
    """
    session.pop("user_id")
    session.pop("nick_name")
    session.pop("mobile")
    session.pop("is_admin", None)
    return jsonify(errno=RET.OK, errmsg="退出成功")
